package com.chunfeng.mypen.result;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Map;

/**
 * Redis缓存数据实体
 * <p>
 * 在实际的开发过程中，我们注意到Redis缓存数据应该是一个完整对象
 * <p>其中包含{@link JsonRequest}实体的数据域(Data)与动态数据域(Other)
 * <p>
 * 如果我们直接将{@link JsonRequest}对象直接放在Redis中
 * <p>一方面会产生空间的浪费，一方面，不利于前端JSON的实时更新
 * <p>
 * 我们希望有一个统一的数据实体或者数据容器用于更好的存储在Redis
 * <p>
 * 在后期我们也能借助这一实体存储更加复杂的对象数据
 * <p>
 *
 * @author by 春风能解释
 * <p>
 * 2024/1/19
 */
@Data
@NoArgsConstructor
public class RedisDataEntity<T> implements Serializable {
    /**
     * 序列化字段
     */
    private static final long serialVersionUID = -5586209480767087302L;
    /**
     * 数据
     */
    private T data;
    /**
     * 其他数据
     */
    private Map<String, Object> other;

    /**
     * 自定义Redis数据格式
     *
     * @param data  数据
     * @param other 动态数据
     */
    public RedisDataEntity(T data, Map<String, Object> other) {
        this.data = data;
        this.other = other;
    }

    /**
     * 将{@link JsonRequest}对象转换为Redis包装对象
     *
     * @param json {@link JsonRequest}对象
     */
    public RedisDataEntity(JsonRequest<T> json) {
        this.data = json.getData();
        this.other = json.getOther();
    }

    /**
     * 将Redis包装对象转换为{@link JsonRequest}对象
     *
     * @return {@link JsonRequest}对象
     */
    @JsonIgnore
    public JsonRequest<T> getJsonRequest() {
        return JsonRequest.success(data, other);
    }
}
